#ifndef DEFINE_CMD_H
#define DEFINE_CMD_H
#include <QEventLoop>
#include <QCoreApplication>
#include "qdebug.h"

#define SUCCESS  (0)
#define FAIL    (-1)

#define TRUE     (1)
#define FALSE    (0)

//双方默认使用端口
#define NETWORK_DEVICE_PORT    5000
#define NETWORK_PC_PORT        5001
#define MULTICAST_ADDRESS   "255.255.255.255"
#define UPLOAD_SIZE_EACH        1024

#define CMD_PASS_INIT           0xFA0A   //密码初始化
#define CMD_PASS_INIT_SUCCESS   0xFA5A   //初始化成功：    ，密码校验
#define CMD_PASS_INIT_FAIL      0xFA5B   //密码校验
#define CMD_PASS_ERROR_REPLY    0xFA5C

//更改密码    =FA 01，密码校验
#define CMD_PASS_CHANGE         0xFA01
//更改成功：    FA 51，密码校验
#define CMD_PASS_CHANGE_SUCCESS 0xFA51
//更改失败：    FA 52，密码校验
#define CMD_PASS_CHANGE_FAIL    0xFA52


// P2P CMD 8A
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define CMD_IPAD_USER_CHANGE_8A         0x8A05
#define CMD_IPAD_USER_CHANGE_8A_SUCCESS 0x8A55
#define CMD_IPAD_USER_CHANGE_8A_FAIL    0x8A56

#define CMD_IPAD_PASS_CHANGE_8A         0x8A03
#define CMD_IPAD_PASS_CHANGE_8A_SUCCESS 0x8A53
#define CMD_IPAD_PASS_CHANGE_8A_FAIL    0x8A54


#define CMD_IPAD_PORT_CHANGE_8A         0x8A01
#define CMD_IPAD_PORT_CHANGE_8A_SUCCESS 0x8A51
#define CMD_IPAD_PORT_CHANGE_8A_FAIL    0x8A52

// END P2P CMD 8A
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CMD_TTG_CEMI_DATA               0xCC99
#define CMD_IPAD_BOARDCAST              0xCC88

//IPAD与网关握手连接
#define CMD_IPAD_P2P_HAND_REQ                   0x8A07
#define CMD_IPAD_P2P_HAND_SUCCESS               0x8A57
#define CMD_IPAD_P2P_HAND_FAIL                  0x8A58

//与网关断开连接
#define CMD_IPAD_P2P_DISCONNECT_REQ             0x8A09
#define CMD_IPAD_P2P_DISCONNECT_SUCCESS         0x8A59
#define CMD_IPAD_P2P_DISCONNECT_FAIL            0x8A5A

// P2P CMD EA
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//更改密码    =FA 01，密码校验
#define CMD_IPAD_USER_CHANGE         0xEA05
//更改成功：    FA 51，密码校验
#define CMD_IPAD_USER_CHANGE_SUCCESS 0xEA55
//更改失败：    FA 52，密码校验
#define CMD_IPAD_USER_CHANGE_FAIL    0xEA56

//更改密码    =FA 01，密码校验
#define CMD_IPAD_PASS_CHANGE         0xEA03
//更改成功：    FA 51，密码校验
#define CMD_IPAD_PASS_CHANGE_SUCCESS 0xEA53
//更改失败：    FA 52，密码校验
#define CMD_IPAD_PASS_CHANGE_FAIL    0xEA54


//更改密码    =FA 01，密码校验
#define CMD_IPAD_PORT_CHANGE         0xEA01
//更改成功：    FA 51，密码校验
#define CMD_IPAD_PORT_CHANGE_SUCCESS 0xEA51
//更改失败：    FA 52，密码校验
#define CMD_IPAD_PORT_CHANGE_FAIL    0xEA52

// END P2P CMD EA
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//更改密码    =FA 01，密码校验
#define CMD_IPAD_IP_CHANGE          0xEA07
//更改成功：    FA 51，密码校验
#define CMD_IPAD_IP_CHANGE_SUCCESS  0xEA57
//更改失败：    FA 52，密码校验
#define CMD_IPAD_IP_CHANGE_FAIL     0xEA58

#define CMD_IPAD_NETWORK_REQ        0xEB01
#define CMD_IPAD_NETWORK_SUCCESS    0xEB51
#define CMD_IPAD_NETWORK_FAIL       0xEB52

#define CMD_IPAD_NETWORK_READ             0xEB03
#define CMD_IPAD_NETWORK_READ_RESULT      0xEB04

//更改密码    =FA 01，密码校验
#define CMD_PASS_CHANGE         0xFA01
//更改成功：    FA 51，密码校验
#define CMD_PASS_CHANGE_SUCCESS 0xFA51
//更改失败：    FA 52，密码校验
#define CMD_PASS_CHANGE_FAIL    0xFA52


//广播查询处于更改IP地址的设备=F5 01，密码无效
#define CMD_BOARDCAST_DEVICE    0xF501

//广播亮编程灯的设备回复：      F5 51，密码返回
#define CMD_DEVICE_STANDBY      0xF551

//更改的IP地址是否被用   =F5 02，密码无效
#define CMD_IP_USED_REQ     0xF502
//用此IP的设备回复：       F5 52，密码无效
#define CMD_IP_USED_ACK     0xF552

//更改IP地址  =F5 03，密码校验
#define CMD_IP_CHANGE_REQ           0xF503
#define CMD_IP_CHANGE_ACK_SUCCESS   0xF553
#define CMD_IP_CHANGE_ACK_FAIL      0xf554

//下载握手：   =F5 0A，密码校验
#define CMD_UPLOAD_HAND             0xF50A
//握手回复：   F5 5A，密码校验
#define CMD_UPLOAD_HAND_ACK         0xF55A

//下载数据：   =F5 0B， 密码校验
#define CMD_UPLOAD_SEND             0xF50B

//接收回复：   F5 5B， 密码校验
#define CMD_UPLOAD_ACK              0xF55B
//升级成功：   F5 5C， 密码校验
#define CMD_UPLOAD_SUCCESS          0xF55C

#define BUS2NETWORK_PHAYADDR_REQ        0xAF55
#define BUS2NETWORK_PHAYADDR_SUCCESS    0xAF01
#define BUS2NETWORK_PHAYADDR_FAIL       0xAF21

#define BUS2NETWORK_GROUPADDR_REQ       0xAF56
#define BUS2NETWORK_GROUPADDR_SUCCESS   0xAF02
#define BUS2NETWORK_GROUPADDR_FAIL      0xAF22

#define NETWORK2BUS_PHAYADDR_REQ        0x55AF
#define NETWORK2BUS_PHAYADDR_SUCCESS    0x5501
#define NETWORK2BUS_PHAYADDR_FAIL       0x5521

#define NETWORK2BUS_GROUPADDR_REQ       0x56AF
#define NETWORK2BUS_GROUPADDR_SUCCESS   0x5602
#define NETWORK2BUS_GROUPADDR_FAIL      0x5622

#define NETWORK2BUS_IPADDR_REQ       0xBF33
#define NETWORK2BUS_IPADDR_SUCCESS   0xBF01
#define NETWORK2BUS_IPADDR_FAIL   0xBF21

typedef char                _string;
typedef unsigned char		_u8;
typedef unsigned short		_u16;
typedef unsigned int		_u32;
typedef int                 _int32;

#define IP_BYTE_3(ip)   ((unsigned char)((ip>>24)&0xff))
#define IP_BYTE_2(ip)   ((unsigned char)((ip>>16)&0xff))
#define IP_BYTE_1(ip)   ((unsigned char)((ip>>8)&0xff))
#define IP_BYTE_0(ip)   ((unsigned char)(ip&0xff))

#define QT_IP_BYTE_3(ip)   (IP_BYTE_0(ip))
#define QT_IP_BYTE_2(ip)   (IP_BYTE_1(ip))
#define QT_IP_BYTE_1(ip)   (IP_BYTE_2(ip))
#define QT_IP_BYTE_0(ip)   (IP_BYTE_3(ip))

#define BYTE_HI(port)   ((unsigned char)((port>>8)&0xff))
#define BYTE_LOW(port)   ((unsigned char)(port&0xff))

#define INDEX_OF_MAGIC     0
#define INDEX_OF_SIZE      2
#define INDEX_OF_PASS      4
#define INDEX_OF_CMD       11
#define INDEX_OF_DATA       13 // sum about


// -1 fail, 0  success, 1 wait
#define UPLOAD_FAIL -1
#define UPLOAD_SUCCESS 0
#define UPLOAD_TIMEOUT 1

#define FILTER_DIRECTION_BUS2NETWORK    0
#define FILTER_DIRECTION_NETWORK2BUS    1

//void processEvents(int execMsecs,int maxtime=100,QEventLoop::ProcessEventsFlags flags=QEventLoop::AllEvents);

#endif // DEFINE_CMD_H
